#!/bin/bash

#备注: 介绍xargs的用法和细节
#功能: 从标准输入读取文本并作为命令执行的参数
#原理: 从标准输入读取参数输入, 并默认以如下符号作为参数分隔符
#1. 制表符或者空格: 多个空格被认定为单个空格
#2. 空行: 忽略空行输入
#3. 换行符: 换行符也是默认分隔符, 视为结束一个输入项并开始下一个。因此，输入项如果以换行符分隔，xargs 会将每一行视为一个单独的输入项。
#4. 如果xargs后面没有命令, 则默认是echo


#将输入换行转为一行
#样本1.txt:
#hello
#world
#new
cat 1.txt | xargs #回车将转为空格输出
#输出结果
#hello world new

#将单行转为多行输入
cat 1.txt | xargs -n 3 #每行参数为3个，分为多行

#以上都是使用默认的空格作为分割符，-d参数支持自定义分隔符
echo 'hellopworldpnewphappy' | xargs -d p  
#输出结果:
#hello world new ha  y

#将echo的输出作为ls的参数进行输出
echo -e 'find.sh    xargs.sh\nscriptreplay.sh ' | xargs ls -la   
#显示结果如下:
#-rwxr-xr-x 1 root root 2620 Nov 26 06:13 find.sh
#-rwxr-xr-x 1 root root  321 Nov 19 08:23 scriptreplay.sh
#-rwxr-xr-x 1 root root   52 Nov 26 07:59 xargs.sh

#固定参数的格式(如find dir -type f -exec grep -n "read" {} \;), 其中dir存在特定txt中,
#形式如下:
#~
#~/Desktop
#~/Source
#采用xargs -I参数可解决类似问题(注意：-I不能和-n同时使用，二者互斥)
cat 1.txt | xargs -I {} find {} -type f -exec grep -n "read" {} \;

#查找文件并删除(-print0允许文件名包含特殊字符 -0以\0作为定界符)
find . -type f -name "*.txt" -print0 | xargs -0 rm -f

#统计代码行数
find . -type f -name "*.c" -print0 | xargs -0 wc -l

#while巧妙实现xargs功能
#demo: cat file.txt | xargs -I {} cat {}
cat file.txt | ( while read arg;do cat $arg;done; ) #一些平台输出第一行
